ugly numbers dynamic programming